package mybatis.session;

import java.io.Closeable;
import java.util.List;

/**
 * SQL会话接口
 *
 * @author richie696
 * @version 1.0
 * @since 2020/11/08
 */
public interface SqlSession extends Closeable {

    /**
     * 查询唯一记录的方法
     *
     * @param statement  SQL语句坐标
     * @param parameters 查询参数
     * @param <T>        查询表的实体Bean类型
     * @return 返回符合条件的记录（如果找不到返回null）
     */
    <T> T selectOne(String statement, Object... parameters);

    /**
     * 根据指定条件查询记录的方法
     *
     * @param statement  SQL语句坐标
     * @param parameters 查询参数
     * @param <E>        查询表的实体Bean类型
     * @return 返回符合条件的所有记录（如果找不到返回空列表）
     */
    <E> List<E> selectList(String statement, Object... parameters);

    /**
     * 插入记录的方法
     *
     * @param statement SQL语句坐标
     * @param parameter 待插入的数据对象
     * @return 返回受影响的记录行数
     */
    int insert(String statement, Object parameter);

    /**
     * 更新记录的方法
     *
     * @param statement SQL语句坐标
     * @param parameter 待更新的数据对象
     * @return 返回受影响的记录行数
     */
    int update(String statement, Object parameter);

    /**
     * 删除记录的方法
     *
     * @param statement SQL语句坐标
     * @param parameter 待删除的数据对象或ID
     * @return 返回受影响的记录行数
     */
    int delete(String statement, Object parameter);

    /**
     * 获取查询接口代理对象的方法
     *
     * @param mapperClass 代理的DAO接口
     * @param <T>         查询表的实体Bean类型
     * @return 返回代理对象
     */
    <T> T getMapper(Class<T> mapperClass);

    void commit();

    void commit(boolean force);

    void rollback();

    void rollback(boolean force);

    void close();

    Configuration getConfiguration();

}
